#ifndef BMP_H
#define BMP_H
#include <iostream>
#include <fstream>
#include <iostream>
#include <string.h>
#include <cstdlib>
#include <cerrno>
#include <fstream>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/fb.h>  
#include <fcntl.h> 
#include <unistd.h>
#include <vector>
#include <algorithm>  
#include <cstdlib> // 为了使用 std::srand 和 std::rand  
#include <ctime>   // 为了使用 std::time  
#include "lcd.h"

using namespace std;

// BMP格式头规范
struct bitmap_header
{
    int16_t type;
    int32_t size; // 图像文件大小
    int16_t reserved1;
    int16_t reserved2;
    int32_t offbits; // bmp图像数据偏移量
}__attribute__((packed));

struct bitmap_info
{
    int32_t size;   // 本结构大小
    int32_t width;  // 图像宽
    int32_t height; // 图像高
    int16_t planes;

    int16_t bit_count; // 色深
    int32_t compression;
    int32_t size_img; // bmp数据大小，必须是4的整数倍
    int32_t X_pel;
    int32_t Y_pel;
    int32_t clrused;
    int32_t clrImportant;
}__attribute__((packed));

// 以下结构体不一定存在于BMP文件中，除非：
// bitmap_info.compression为真
struct rgb_quad
{
    int8_t blue;
    int8_t green;
    int8_t red;
    int8_t reserved;
}__attribute__((packed));
class BMP
{
    string bmpname;
    int width;
    int height;
    int bit;
    int bmpsize;
    char *rgb;
    char *bmpmen; //用来存放正序rgb数据
    int tosize;
    int x;
    vector<vector<char*> > pz; //用来存放图片碎片
    vector<vector<int> > win;  //用来判断胜利条件
    vector<vector<int> > win2; //用来和win作比较
public:
    BMP(){};
    BMP(const string filename,LCD &lcd,int x);
    BMP(const string filename);
    ~BMP();
    void info();
    void keep(LCD &lcd);
    void display(LCD &lcd);
    void management(LCD &lcd);
    void randomize();
    void playman(LCD &lcd);
    void move(int a,int b,LCD &lcd);
    void move2(int a,int &b,int &c);
    bool ifwin();
};

#endif // BMP_H